﻿//#include <stdio.h>
//#include <stdlib.h>
//#include <winsock2.h> 
//#include <iphlpapi.h>
//#include <iostream>
//#pragma comment(lib, "ws2_32.lib")
//#pragma comment(lib, "iphlpapi.lib")//函数所需
//#define MIB_IF_TYPE_IEEE80211 71//函数所需
//#define MAX_BUF_SIZE 1024 
//
////一个函数，自动获取本机无线局域网适配器 WLAN的IPV4地址，以字符串的形式返回地址
//char* getIPAddress()
//{
//    PIP_ADAPTER_INFO pAdapterInfo;
//    PIP_ADAPTER_INFO pAdapter = NULL;
//    DWORD dwRetVal = 0;
//    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
//    pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
//    if (pAdapterInfo == NULL)
//        return NULL;
//    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW){
//        free(pAdapterInfo);
//        pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
//        if (pAdapterInfo == NULL)
//            return NULL;
//    }
//    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR){
//        pAdapter = pAdapterInfo;
//        while (pAdapter){
//            if (pAdapter->Type == MIB_IF_TYPE_IEEE80211){ // 判断是否是无线局域网适配器
//                IP_ADDR_STRING* pIpAddress = &pAdapter->IpAddressList;
//                while (pIpAddress){ 
//                    if (pIpAddress->IpAddress.String[0] != '0'){ 
//                        // 判断是否是有效的IP地址
//                        char* ip = (char*)malloc(sizeof(char) * (strlen(pIpAddress->IpAddress.String) + 1));
//                        strcpy(ip, pIpAddress->IpAddress.String);
//                        free(pAdapterInfo);
//                        return ip;
//                    }
//                    pIpAddress = pIpAddress->Next;
//                }
//            }
//            pAdapter = pAdapter->Next;
//        }
//    }
//    free(pAdapterInfo);
//    
//    return NULL;
//}
//
//int main(){
////1、初始化网络库
//    WSADATA wsaData;
//    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
//        printf("Windows网络库初始化失败！错误码：%d\n", WSAGetLastError());
//        WSACleanup();
//        return -1;
//    }
//    printf("Windows网络库初始化成功！\n");
//    printf("winsock库版本信息：%d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
//
////2、创建UDPsocket
//    int udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//    if (udpSocket == INVALID_SOCKET){
//        printf("创建UDP Socket失败！\n");
//        printf("错误码：%d\n", WSAGetLastError());
//        closesocket(udpSocket);
//        WSACleanup();
//        return -1;
//    }
//    printf("创建UDP Socket成功！\n");
//
////3、设置服务端地址和端口
//    struct sockaddr_in addr;
//    memset(&addr, 0, sizeof(struct sockaddr_in));
//    addr.sin_family = AF_INET;
//
//    char* ipv4 = getIPAddress();
//    if (ipv4 != NULL){
//        printf("自动获取并设置IP地址 ： %s\n", ipv4);
//        //addr.sin_addr.s_addr = htonl(INADDR_ANY);
//        addr.sin_addr.s_addr = inet_addr(ipv4);
//    }
//    else {
//        printf("自动获取IP地址失败,请手动输入:");
//        scanf("%s", ipv4);
//        addr.sin_addr.s_addr = inet_addr(ipv4);
//    }
//
//    int port = 0;
//    printf("请输入端口号：");
//    scanf("%d", &port);
//    addr.sin_port = htons(port);
//
//    printf("\n已设置\n服务端IP地址 ： %s\n服务器端口号：%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
//
// //4、绑定地址和端口
//    if (bind(udpSocket, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1){
//        closesocket(udpSocket);
//        WSACleanup();
//        printf("绑定sockte错误");
//        return -1;
//    }
//    printf("\n服务端已启动，等待客户端发送消息\n");
//
////5、等待客户端发送
//    char buf[MAX_BUF_SIZE] = { 0 };
//    struct sockaddr_in clientAddr;
//    int len = sizeof(struct sockaddr_in);
//    while (1){
//        int recvLen = recvfrom(udpSocket, buf, MAX_BUF_SIZE, 0, (struct sockaddr*)&clientAddr, &len);
//        if (recvLen == SOCKET_ERROR){
//            printf("接收消息错误，错误码：%d\n", WSAGetLastError());
//            continue;
//        }
//        //buf[recvLen] = '\0';
//        printf("接收到来自 %s:%d 的消息>>>%s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buf);
//        memset(&buf, 0, sizeof(buf));
//    }
//
//    closesocket(udpSocket);
//    WSACleanup();
//
//    return 0;
//}


